/*
 * enum.c
 *
 *  Created on: 2013-5-8
 *      Author: xkaying
 */

#include "token.h"
#include "enum.h"

#include "../common/list.h"

#include <assert.h>
#include <stdlib.h>
#include <stdio.h>

struct _enumitem
{
		char *name;
		int value;
};
struct _enum{
		char *name;
		List *pitems;
		int nowvalue;
		int prority;
};

Enum *EnumInit(char *name,int prority)
{
	Enum *penum;
	penum=(Enum*)malloc(sizeof(penum));
	penum->name=0;
	penum->nowvalue=0;
	penum->pitems=ListInit();
	penum->prority=prority;
	return penum;
}

char *EnumItemGetName(EnumItem *pitem)
{
	assert(pitem);
	return pitem->name;
}
int EnumItemGetValue(EnumItem *pitem)
{
	assert(pitem);
	return pitem->value;
}

char *EnumGetName(Enum *penum)
{
	assert(penum);
	return penum->name;
}

void EnumAppend(Enum *penum,char *name,int value)
{
	assert(penum);
	assert(name);
	//检查名字是否重复,重复,则提出警告
	ListCursor *pcursor;
	pcursor=ListGetCursor(penum->pitems);
	EnumItem *pitem;
	pitem=ListForeach(penum->pitems,pcursor);
	while(pitem){
		if(pitem->name==name){
			printf("警告:枚举类型中,数据项名字重复.默认取先定义的数据项有效.重复的数据项:%s",name);
		}
		if(value!=0){
			if(pitem->value==value){
				printf("警告:枚举类型中,数据项的数据值重复.默认修改的数据项%s的数据值.",name);
				value=0;
			}
		}
	}
	if(value==0){
		value=penum->nowvalue;
		penum->nowvalue++;
	}else{
		if(value>penum->nowvalue){
			penum->nowvalue=value+1;
		}
	}
	pitem=(EnumItem*)malloc(sizeof(EnumItem));
	pitem->name=name;
	pitem->value=value;
	ListPush(penum->pitems,pitem);
}

